nc, cURL, Chrome, openssl s_client, RDP で SOCKS プロキシーを使う(& socatのご紹介)
SOCKS 4 プロキシを経由しないとアクセス出来ない Web 環境(のSSL証明書)をテストする必要があったので、各試験用コマンドで SOCKS4 プロキシーを使う方法を調べました。また、その過程で socat
というツールも見つかったのでご紹介します。
前提
以下、下記の前提で話を進めます。
- プロキシーサーバのホスト名は
proxy.example1.jp
- プロトコルは SOCKS4、ポートは 1080/TCP
- 試験対象(接続したい Web 環境)の URL は
https://target.example9.jp/
クライアント側の作業環境は macOS High Sierra になりますが、CLIコマンドなどは Linux でも使用可能かと思います。
nc (netcat)
443/TCP が LISTEN しているか、そもそも作業環境・プロキシーサーバからアクセス出来るか(SG 等で許可されているか・いないか)を確認するために nc -z
を使います。
-x
オプションが SOCKS4 に対応しているので、コマンドラインは下記のようになります。
$ nc -x proxy.example1.jp:1080 -z target.example9.jp 443
cURL
SSL 証明書の情報を表示するために curl -Iv
を実行します。
--proxy
あるいは --preproxy
オプションが SOCKS4 に対応しているので、そちらで指定します。
$ curl -Iv --proxy socks4://proxy.example1.jp:1080 https://target.example9.jp/
当初指定方法がよくなかったのか --proxy
だと上手くいかないときがあったので --preproxy
もご紹介していますが、本来はどちらも SOCKS4 に対応しています。--proxy
の動作が思わしくない時には --preproxy
も試してみて下さい。
--preproxy [protocol://]host[:port]
Use the specified SOCKS proxy before connecting to an HTTP or HTTPS -x, --proxy.
Chrome (一時的な利用)
コマンドラインでもいいのですけど、念のためにブラウザで表示・確認したい、という話はそこそこあるように思います。
Firefox なら普通に設定可能ですし、そもそも macOS も標準で SOCKS プロキシを設定可能です。FoxyProxy などの機能拡張を使うことも便利ですが、ちょっと確認するためだけにいろいろと設定を変えてしまうのは、戻すことを考えると面倒です。
Google Chrome をコマンドラインオプションを付けて起動することで、一時的に SOCKS プロキシーを使用する状態でブラウザが使えます。。
$ /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --proxy-server="socks4://proxy.example1.jp:1080" \ https://target.example9.jp/
既に Chrome が起動していると有効になりませんので、そこだけお気をつけください。
参考
- Configuring a SOCKS proxy server in Chrome - The Chromium Projects
- ssh経由のSOCKSプロキシを通じてMac上のGoogle Chromeでブラウジング
- FoxyProxy Standard – Firefox 向けアドオン
- FoxyProxy Standard - Chrome ウェブストア
openssl
SSL 証明書を試験する以上、openssl
コマンドでの詳細確認を行いたくなるのですが、残念ながら標準では SOCKS4 プロキシに対応していません(HTTP プロキシには対応しています)。
仕方ないので、何かしらのリダイレクタを使用してポート転送してあげることにします。いろいろと探してみて socat
が使いやすかったのでご紹介します。
socat
このソフトウェアは非常に多機能で、SOCKS4 以外のプロトコルにも幅広く対応しているのですが、今回の目的からは外れるので割愛します。
socat
自体は brew
でインストール可能です。
$ brew install socat
手順としては、まず socat
を使って作業環境とターゲットの Web 環境の間に TCP のトンネル( SOCKS プロキシサーバ経由)を作成し、そのトンネルを通って openssl
コマンドが通信を行う順番になります。
トンネルは下記のように実行して作成します。
$ socat TCP4-LISTEN:8443 SOCKS4:proxy.example1.jp:target.example9.jp:443,socksport=1080
これで、作業環境の localhost、8443/TCP への通信が、そのまま target.example9.jp の 443/TCP へ転送されることになります。
( 1080/TCP は SOCKS プロトコルのデフォルトポートなので、,socksport=1080
は省略可能です)
openssl s_client
トンネルが出来れば、あとはそこを通って通信するだけです。もう一枚ターミナルを開き、openssl
コマンドの接続先を localhost:8443 にして実行します。
$ openssl s_client -connect 127.0.0.1:8443 \ -servername target.example9.jp </dev/null 2>/dev/null
おまけ : RDP via SOCKS4
今回の目的とは外れるのですが、socat
を使うと本来対応していないアプリ・ソフトウェアも SOCKS4 経由で利用できます。
試しに Remote Desktop クライアントを使ってみました。RDP は 3389/TCP なので、下記のように実行します(RDP-TARGET-HOST.example9.jp が接続したい Windows サーバのホスト名、あるいは IP アドレスになります)。
$ socat TCP4-LISTEN:13389 SOCKS4:proxy.example1.jp:RDP-TARGET-HOST.example9.jp:3389
Remote Desktop クライアントの接続先は localhost:13389 にします。
この設定で接続することで、SOCKS プロキシ経由で RDP アクセス出来ます。ターゲットの Windows へログインした後、コマンドプロンプトから netstat などで確認してみて下さい。
もっとも、SOCKS4 に対応している RDP クライアントとして Parallels Client があるので、常用するならこちらを使う方が良いかと思います。
Parallels Client の記事としては、弊社植木の下記の記事をご参照ください。
macOSからWindowsにリモートデスクトップする時はParallels Clientがキーボード入力も快適でオススメ
まとめ
nc
とcurl
は SOCKS4 に対応している- Google Chrome はコマンドラインオプションでプロキシを一時的に設定できる
socat
超便利。openssl
も Remote Desktop もこれ経由で使用可能